package ejb;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entities.Gruppo;
import entities.PacchettoViaggio;
import entities.UtenteRegistrato;

/**
 * Session Bean implementation class UtenteMgrBean
 */
@Stateless
public class UtenteMgrBean implements UtenteMgrBeanLocal {
		
	@PersistenceContext
    private EntityManager em;
	
	@Resource
	private EJBContext context;
	
	@Override
	public void aggiungi(UtenteDTO user){
		UtenteRegistrato nuovo = new UtenteRegistrato(user);
		List<Gruppo> groups = new ArrayList<Gruppo>();
        groups.add(trovaGruppoFromId("UTENTI"));
		nuovo.setGruppi(groups);
		em.persist(nuovo);
	}
	
	public Gruppo trovaGruppoFromId(String id){	
		return em.find(Gruppo.class, id);
	}

	@Override
	public void modifica(UtenteDTO user, String indice) {
		Query q = em.createNamedQuery("UtenteRegistrato.MODIFICA");
		q.setParameter("id", indice);
		q.setParameter("nome", user.getNome());
		q.setParameter("cognome", user.getCognome());
		q.setParameter("email", user.getEmail());
		q.setParameter("dataNascita", user.getDataNascita());
		q.setParameter("telefono", user.getTelefono());
		q.executeUpdate();
	}
	
	@Override
	public UtenteDTO getUtenteDTO() {
		UtenteDTO userDTO = convertToDTO(getPrincipalUser());
		return userDTO;
	}
	
	 private UtenteDTO convertToDTO(UtenteRegistrato user) {
		UtenteDTO userDTO = new UtenteDTO();
		userDTO.setEmail(user.getEmail());
		userDTO.setNome(user.getNome());
		userDTO.setCognome(user.getCognome());
		userDTO.setDataNascita(user.getDataNascita());
		userDTO.setIdUtente(user.getIdUtente());
		userDTO.setTelefono(user.getTelefono());
		return userDTO;
	}
	 
	 public UtenteRegistrato trova(String username) {
	    return em.find(UtenteRegistrato.class, username);
	}
	
	 public UtenteRegistrato getPrincipalUser() {
	    return trova(getPrincipalUsername());
	 }
	 
	 public String getPrincipalUsername() {
	    return context.getCallerPrincipal().getName();
	 }
	 
	 public List<?> getUtenti() {
	    Query q = em.createNamedQuery("UtenteRegistrato.FIND_ALL", UtenteRegistrato.class);
	    Gruppo g = trovaGruppoFromId("UTENTI");
	    q.setParameter("gruppi", g);
	    return q.getResultList();
	 }
	 
	 @Override
	 public void prenota(int indice) {
		PacchettoViaggio pacchetto = em.find(PacchettoViaggio.class, indice);
		UtenteRegistrato cliente = getPrincipalUser();
		cliente.getPrenotazioni().add(pacchetto);
	}
	 
	 @Override
	 public List<?> getPrenotazioni(){
		Query q = em.createNamedQuery("UtenteRegistrato.FIND_PRENOTAZIONI_ONE");
		q.setParameter("id", getPrincipalUser().getIdUtente());
		return q.getResultList();
	 }
	 
	 @Override
	 public List<?> getPrenotazioniCliente(String username){
		Query q = em.createNamedQuery("UtenteRegistrato.FIND_PRENOTAZIONI_ONE");
		q.setParameter("id", username);
		return q.getResultList();
	 }
	 
	 @Override 
	 public boolean isListPrenotazioniVuota(){
		PacchettoViaggio p = (PacchettoViaggio)(getPrenotazioni().get(0));
		if(p == null){
			return true;
		}
		return false;
	 }
	 
	 @Override
	 public boolean isPrenotato(int indice){
		if(getPrenotazioni().contains(em.find(PacchettoViaggio.class, indice))){
			return true;
		}
		return false;
	 }
	 
	 @Override
	 public void rendiDipendente(String username){
		 UtenteRegistrato u = em.find(UtenteRegistrato.class, username);
		 List<Gruppo> groups = new ArrayList<Gruppo>();
	     groups.add(trovaGruppoFromId("DIPENDENTI"));
	     u.setGruppi(groups);
	 }
}